From 83904107a33c9badc34ecdd1f8ca0f9271e5e370 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 8 Sep 2009 15:10:31 +0100 Subject: [PATCH] VT-d: prevent dom0 to use VT-d HW pv-ops dom0 contains Linux upstream VT-d driver, and will go to enable it when VT-d is set in kernel config file. It should not enable VT-d in dom0. Currently it already zaps ACPI DMAR signature to prevents dom0 using VT-d HW when VT-d is enabled for Xen. But when VT-d is not enabled for Xen, and VT-d is set in pv-ops kernel config file, pv-ops dom0 will go to enable it. This will results in pv-ops dom0 booting failure. This patch prevents dom0 to use VT-d HW whether VT-d is enabled or disabled for Xen. Signed-off-by: Weidong Han --- xen/drivers/passthrough/vtd/dmar.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/vtd/dmar.c index 4386149ac9..7f8dbb72fb 100644 --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -517,6 +517,12 @@ static int __init acpi_parse_dmar(struct acpi_table_header *table) dmar = (struct acpi_table_dmar *)table; + if ( !iommu_enabled ) + { + ret = -EINVAL; + goto out; + } + if ( !dmar->width ) { dprintk(XENLOG_WARNING VTDPREFIX, "Zero: Invalid DMAR width\n"); @@ -563,9 +569,6 @@ static int __init acpi_parse_dmar(struct acpi_table_header *table) entry_header = ((void *)entry_header + entry_header->length); } - /* Zap APCI DMAR signature to prevent dom0 using vt-d HW. */ - dmar->header.signature[0] = '\0'; - if ( ret ) { if ( force_iommu ) @@ -579,6 +582,9 @@ static int __init acpi_parse_dmar(struct acpi_table_header *table) } } +out: + /* Zap ACPI DMAR signature to prevent dom0 using vt-d HW. */ + dmar->header.signature[0] = '\0'; return ret; } @@ -599,9 +605,6 @@ int acpi_dmar_init(void) if ( force_iommu ) iommu_enabled = 1; - if ( !iommu_enabled ) - goto fail; - rc = parse_dmar_table(acpi_parse_dmar); if ( rc ) goto fail; -- 2.30.2